﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.ComponentModel;

namespace Deeper.Common
{

	/// <summary>
	/// 获取枚举的标注
	/// </summary>
	public static class EnumHelper
	{
		/// <summary>
		/// 默认空的Item，值为-999
		/// </summary>
		public static int NullEnum { get { return -999; } }
		/// <summary>
		/// 获取备注名称
		/// </summary>
		/// <param name="obj"></param>
		/// <param name="isTop"></param>
		/// <returns></returns>
		public static string GetDescription(this Enum obj)
		{
			if (obj == null)
			{
				return string.Empty;
			}
			try
			{
				Type _enumType = obj.GetType();
				DescriptionAttribute dna = null;

				FieldInfo fi = _enumType.GetField(Enum.GetName(_enumType, obj));
				dna = (DescriptionAttribute)Attribute.GetCustomAttribute(
					fi, typeof(DescriptionAttribute));

				if (dna != null && string.IsNullOrEmpty(dna.Description) == false)
					return dna.Description;
			}
			catch
			{
			}
			return obj.ToString();
		}

		/// <summary>
		/// 获取枚举列表
		/// </summary>
		/// <param name="enumType"></param>
		/// <param name="withAll"></param>
		/// <returns></returns>
		public static List<EnumItem> GetEnumItems(this Type enumType, bool withAll = false)
		{
			List<EnumItem> list = new List<EnumItem>();

			if (enumType.IsEnum != true)
			{
				// 不是枚举类型    
				throw new InvalidOperationException();
			}

			// 包含 All 选项    
			if (withAll == true)
				list.Add(new EnumItem("全部", NullEnum));

			// 获得特性Description的类型信息    
			Type typeDescription = typeof(DescriptionAttribute);

			// 获得枚举的字段信息（因为枚举的值实际上是一个static的字段的值）    
			System.Reflection.FieldInfo[] fields = enumType.GetFields();

			// 检索所有字段    
			foreach (FieldInfo field in fields)
			{
				// 过滤掉一个不是枚举值的，记录的是枚举的源类型    
				if (field.FieldType.IsEnum == false)
					continue;

				// 通过字段的名字得到枚举的值    
				int value = (int)enumType.InvokeMember(field.Name, BindingFlags.GetField, null, null, null);
				string text = string.Empty;

				// 获得这个字段的所有自定义特性，这里只查找Description特性    
				object[] arr = field.GetCustomAttributes(typeDescription, true);
				if (arr.Length > 0)
				{
					// 因为Description自定义特性不允许重复，所以只取第一个    
					DescriptionAttribute aa = (DescriptionAttribute)arr[0];
					// 获得特性的描述值    
					text = aa.Description;
				}
				else
				{
					// 如果没有特性描述，那么就显示英文的字段名    
					text = field.Name;
				}
				list.Add(new EnumItem(text, value));
			}
			return list;
		}

		public class EnumItem
		{
			public object Value { set; get; }

			public object Text { set; get; }

			public EnumItem(object text, object value)
			{
				Value = value;
				Text = text;
			}
		}

	}
}
